home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 53 / PC Actual CD 53.iso / VNULabs / Microcontroladores / DS1821.asm
Encoding:
Assembly Source File  |  2001-01-03  |  15.5 KB  |  383 lines

  1. ;****************************************************************************************
  2. ; Programa DS1821.ASM           Fecha : 21/Agosto/2000                    *
  3. ;                                            *
  4. ; Este programa lee la temperatura de un sensor DS1821                    *
  5. ; y lo muestra en un display de 7 segmentos                        *
  6. ;  Eugenio Martφn Cuenca y JosΘ Marφa Moreno Balboa                    *
  7. ;                                            *
  8. ; Revisi≤n : 0.0                        Programa para PIC16C84 y PIC16F84        *
  9. ; Velocidad del Reloj: 4 MHz            Reloj Instrucci≤n: 1 MHz = 1 S            *
  10. ; Perro Guardißn :  deshabilitado       Tipo de Reloj : XT                *
  11. ; Protecci≤n del c≤digo : OFF                                *
  12. ;************* IGUALDADES ***************************************************************
  13. ; ********** Igualdades que designa los destinos ****************************************
  14. w                EQU     0    ; El resultado se guarda en w
  15. f                EQU     1    ; El resultado se guarda en el registro
  16. ; *********** Igualdades de la CPU y del mapa de memoria ********************
  17. PORTA                EQU    05h    ; Puerta A
  18. PORTB                EQU    06h    ; Puerta B
  19. TRISA                EQU    05h    ; Registro Triestado Puerta A
  20. TRISB                EQU    06h    ; Registro Triestado Puerta B
  21. STATUS                EQU    03h    ; Registro Status
  22. PCL                EQU    02h      ; direcci≤n del registro PCL
  23. ;bits del registro STATUS
  24. C                EQU     00h
  25. DC                EQU     01h
  26. Z                EQU     02h
  27. RP0                EQU     05h
  28. RP1                EQU     06h
  29. IRP                EQU     07h
  30. ; *********** Constantes del Programa
  31. CERO                EQU    0beh
  32. UNO                EQU    00ch
  33. DOS                EQU    076h
  34. TRES                EQU    05eh
  35. CUATRO                EQU    0cch
  36. CINCO                EQU    0DAh
  37. SEIS                EQU    0F8h
  38. SIETE                EQU    00Eh
  39. OCHO                EQU    0FEh
  40. NUEVE                EQU    0CEh
  41. MENOS                EQU    040h
  42. PIN_DATOS            EQU    00h
  43. ;****************************************************************************************    
  44. ;          Variables del programa                            *
  45. ;****************************************************************************************
  46.                 ORG    0Ch
  47. bContador1            res    1    ; Registro utilizado en el retardo
  48. bContador2            res    1    ; Registro utilizado en el retardo
  49. bContador3            res    1    ; Registro utilizado en el retardo
  50. bTemporal            res    1    ; Almacenamiento temporal
  51. bDigito1            res    1    ; Almacena el dφgito 1
  52. bDigito2            res    1    ; Almacena el dφgito 2
  53. bDigito3            res    1    ; Almacena el dφgito 3
  54. bTemperatura            res    1    ; Almacema el valor de la temperatura
  55. bTemperaturaTmp            res    1    ; Almacema el valor de la temperatura
  56. bByteSalidaDS            res    1    ; Almacema el valor de salida para DS1821
  57. bByteEntradaDS            res    1    ; Almacema el valor de salida para DS1821
  58.  
  59. ; ***************************************************************************************
  60. ; *                     Inicializaci≤n                            *
  61. ; ***************************************************************************************
  62.             ORG    00h        ; Direcci≤n del vector de Reset
  63.             GOTO    lblInicio    ; Comienza el programa despuΘs
  64.                         ; del vector de interrupci≤n
  65.  
  66.             ORG    05h        ; Una posici≤n detras vector Interrupci≤n
  67. lblInicio
  68.                   BSF    STATUS,RP0    ; Selecciona la pßgina 1 de la memoria
  69.             CLRF    TRISB        ; Programa Puerto B como salida 
  70.             CLRF    TRISA        ; Programa Puerto A como salida 
  71.             BCF    STATUS,RP0    ; Vuelve a la pßgina 0
  72.  
  73.             CLRF    PORTA        ; Ponemos a cero PuertoA
  74.              CLRF    TRISA        ; Puerto A como salida 
  75.  
  76.             CALL    subDS1821ConDev    ; Configurar dispositivo para
  77.                         ; incio del funcionamiento.
  78. ;****************************************************************************************
  79. ;*                         Bucle Principal del Programa                    *
  80. ;****************************************************************************************
  81. lblBucle         CLRF    bDigito1    ; Borramos el contenido del Dφgito 1
  82.             CLRF    bDigito2    ; Borramos el contenido del Dφgito 2
  83.             CLRF    bDigito3    ; Borramos el contenido del Dφgito 3
  84.  
  85.             CALL    subDS1821StaConv; Iniciamos la conversi≤n
  86.        
  87.             CALL    subDS1821LeeTem    ; Leemos el valor de la temperatura
  88.  
  89.             MOVWF    bTemperatura        
  90.             CALL    subDS1821StoConv; Paramos la conversi≤n
  91.  
  92.             CALL    subConvierteTemp; Hacemos la conversi≤n de binario a BCD
  93.             CALL    subMuestra    ; Mostramos en los displays la temperatura
  94.  
  95.             GOTO    lblBucle    ; Iniciamos la secuencia otra vez
  96.  
  97. ;************************************************************************************************
  98. ; Subrutina: subRetardo10us ---> Produce un retardo de n * 10 us                *
  99. ;entrada               w -> multiplos de 10us de retardo                    *
  100. ;salida                nada                                    *
  101. ;variables utilizadas: bContador1 -> contador                            *
  102. ;************************************************************************************************
  103. subRetardo10us        MOVWF bContador1
  104. lblRetardo10us        NOP
  105.             NOP
  106.             NOP
  107.             NOP
  108.             NOP
  109.             NOP
  110.             NOP
  111.             DECFSZ    bContador1 , f
  112.             GOTO    lblRetardo10us
  113.             RETURN
  114. ;************************************************************************************************
  115. ;Subrutina: subRetardoNms ---> Produce un retardo de n * 1ms                    *
  116. ;entrada               w -> multiplos de 1ms de retardo                        *
  117. ;salida                nada                                    *
  118. ;variables utilizadas:    bContador1 -> contador                            *
  119. ;                  bContador2 -> contador                        *
  120. ;************************************************************************************************
  121. subRetardoNms        MOVWF    bContador2
  122. lblRetardoNms1        MOVLW    .110
  123.             MOVWF    bContador1
  124. lblRetardoNms2        NOP
  125.             NOP
  126.             NOP
  127.             NOP
  128.             NOP
  129.             NOP
  130.             DECFSZ    bContador1, f
  131.             GOTO    lblRetardoNms2
  132.             DECFSZ    bContador2, F
  133.             GOTO    lblRetardoNms1
  134.             RETURN
  135. ; ***********************************************************************************************
  136. ; Subrutina: subDigito --->  Coloca en el acumulador el Valor de los 7 segmentos        *
  137. ;                                                *
  138. ; Entrada:    w -> Dφgito mostrar                                *
  139. ; Salida:    w -> Representaci≤n del dφgito                            *
  140. ; ***********************************************************************************************
  141. subDigito        ADDWF    PCL,f        ; suma al contador bajo de programa el acmulador   
  142.             RETLW    CERO        ; sale y guarda en w el c≤digo del cero
  143.             RETLW    UNO        ; sale y guarda en w el c≤digo del uno
  144.             RETLW    DOS        ; sale y guarda en w el c≤digo del dos
  145.             RETLW    TRES        ; sale y guarda en w el c≤digo del tres
  146.             RETLW    CUATRO        ; sale y guarda en w el c≤digo del cuatro
  147.             RETLW    CINCO        ; sale y guarda en w el c≤digo del cinco
  148.             RETLW    SEIS        ; sale y guarda en w el c≤digo del seis
  149.             RETLW    SIETE        ; sale y guarda en w el c≤digo del siete
  150.             RETLW    OCHO        ; sale y guarda en w el c≤digo del ocho
  151.             RETLW    NUEVE        ; sale y guarda en w el c≤digo del nueve
  152.             RETLW    MENOS        ; sale y guarda en w el c≤digo del nueve
  153. ; ***********************************************************************************************
  154. ; Subrutina: subDS1821Pin1 ---- > Coloca a uno el bit de salida para el DS1821            *
  155. ;                                                *
  156. ; Entrada:    nada                                        *
  157. ; Salida:    nada                                        *
  158. ; ***********************************************************************************************
  159. subDS1821Pin1        BSF    STATUS    , RP0
  160.             BSF    TRISB    , PIN_DATOS    ; Colocamos la lφnea en alta impedancia
  161.             BCF    STATUS    , RP0
  162.             RETURN
  163. ; ***********************************************************************************************
  164. ; Subrutina: subDS1821Pin0 ---> Coloca a cero el bit de salida para el DS1821            *
  165. ;                                                *
  166. ; Entrada:    nada                                        *
  167. ; Salida:    nada                                        *
  168. ; ***********************************************************************************************
  169. subDS1821Pin0        BCF    PORTB    , PIN_DATOS
  170.             BSF    STATUS    , RP0
  171.             BCF    TRISB    , PIN_DATOS    ; Colocamos la lφnea a cero
  172.             BCF    STATUS    , RP0
  173.             RETURN
  174. ; ***********************************************************************************************
  175. ; Subrutina: subDS1821Init ---> Ejecuta la instrucci≤n de inicio para el dispositivo DS1821    *
  176. ;                                                *
  177. ; Entrada:    nada                                        *
  178. ; Salida:    nada                                        *
  179. ; ***********************************************************************************************
  180. subDS1821Init        CALL    subDS1821Pin1
  181.             CALL    subDS1821Pin0
  182.             MOVLW    .50            ; 500 us de retardo
  183.             CALL    subRetardo10us
  184.             CALL    subDS1821Pin1            
  185.             MOVLW    .50            ; 500 us de retardo
  186.             CALL    subRetardo10us
  187.             RETURN
  188. ; ***********************************************************************************************
  189. ; Subrutina: subDS1821ConDev ---> Ejecuta la instrucci≤n de configuraci≤n del DS1821        *
  190. ;                                                *
  191. ; Entrada:    nada                                        *
  192. ; Salida:    nada                                        *
  193. ; ***********************************************************************************************
  194. subDS1821ConDev        CALL    subDS1821Init
  195.  
  196.             MOVLW    0CH
  197.             MOVWF    bByteSalidaDS
  198.             CALL    subDS1821ByteOut    ; Configura al dispositivo ds1821 modo
  199.             MOVLW    03H            ; 1 hilo (1-Wire) y activa polaridad = 1
  200.             MOVWF    bByteSalidaDS
  201.             CALL    subDS1821ByteOut
  202.             MOVLW    .20            
  203.             CALL    subRetardoNms
  204.             RETURN
  205. ; ***********************************************************************************************
  206. ; Subrutina: subDS1821StaConv ---> Ejecuta instrucci≤n de inicio de conversi≤n del DS1821    *
  207. ;                                                *
  208. ; Entrada:    nada                                        *
  209. ; Salida:    nada                                        *
  210. ; ***********************************************************************************************
  211. subDS1821StaConv    CALL    subDS1821Init
  212.             MOVLW    0EEH
  213.             MOVWF    bByteSalidaDS
  214.             CALL    subDS1821ByteOut
  215.             MOVLW    .5        ; delay for 100 msec para conversi≤n
  216.             CALL    subRetardoNms
  217.             RETURN
  218. ; ***********************************************************************************************
  219. ; Subrutina: subDS1821LeeTem ---> Ejecuta instrucci≤n de lectura de la temperatura del DS1821    *
  220. ;                                                *
  221. ; Entrada:    nada                                        *
  222. ; Salida:    w -> Temperatura                                *
  223. ; ***********************************************************************************************
  224. subDS1821LeeTem        CALL    subDS1821Init
  225.             MOVLW    0AAH
  226.             MOVWF    bByteSalidaDS
  227.             CALL    subDS1821ByteOut
  228.             CALL    subDS1821ByteIn
  229.             MOVF    bByteEntradaDS , w
  230.             RETURN
  231. ; ***********************************************************************************************
  232. ; Subrutina: subDS1821StoConv ---> Ejecuta la instrucci≤n parada de la conversi≤n del DS1821    *
  233. ;                                                *
  234. ; Entrada:    nada                                        *
  235. ; Salida:    nada                                        *
  236. ; ***********************************************************************************************
  237. subDS1821StoConv    CALL    subDS1821Init
  238.             MOVLW    22H
  239.             MOVWF    bByteSalidaDS
  240.             CALL    subDS1821ByteOut
  241.             RETURN
  242. ; ***********************************************************************************************
  243. ; Subrutina: subDS1821ByteIn ---> Lee un byte en el DS1821                    *
  244. ;                                                *
  245. ; Entrada:    nada                                        *
  246. ; Salida:    nada                                        *
  247. ;variables utilizadas:    bContador3 -> contador                            *
  248. ; ***********************************************************************************************
  249. subDS1821ByteIn        MOVLW    .8        ; El valor a leer del dispositivo DS1821
  250.             MOVWF    bContador3    ; es un byte, que estß compuesto por 8 bits
  251.             CLRF    bByteEntradaDS    
  252. lblDS1821Byte        CALL    subDS1821Pin0    ; Realizamos un ciclo de lectura, los ciclos de 
  253.             NOP            ; lectura estßn sincronizados por tiempo
  254.             CALL    subDS1821Pin1
  255.             NOP
  256.             NOP
  257.             NOP
  258.             NOP
  259.             NOP
  260.             NOP
  261.             MOVF    PORTB    , w        
  262.             MOVWF    bTemporal
  263.             BTFSS    bTemporal , PIN_DATOS    ; Dependiendo del valor del bit 0
  264.             BCF    STATUS    , C               ; de PortB donde se conecta el DS1821
  265.             BTFSC    bTemporal , PIN_DATOS    ; se interpreta que la lectura es un
  266.             BSF    STATUS    , C               ; uno ≤ un cero
  267.             RRF    bByteEntradaDS , f
  268.             MOVLW    .6            
  269.             CALL    subRetardo10us
  270.             DECFSZ    bContador3    , f    ; Leemos los 8 bits del byte mandados por
  271.             GOTO    lblDS1821Byte        ; el dispositivo ds1821
  272.             MOVFW    bByteEntradaDS    
  273.             RETURN
  274. ; ***********************************************************************************************
  275. ; Subrutina: subDS1821ByteOut ---> Escribe un byte del DS1821                    *
  276. ;                                                *
  277. ; Entrada:    nada                                        *
  278. ; Salida:    nada                                        *
  279. ;variables utilizadas:    bContador3 -> contador                            *
  280. ; ***********************************************************************************************
  281. subDS1821ByteOut    MOVLW    .8            ; El valor a mandar al DS1821 es un byte
  282.             MOVWF    bContador3        ; que estß compuesto por 8 bits
  283. lblDS1821ByteOut3    RRF    bByteSalidaDS    , f    ; Dependiendo del valor del bit de datos
  284.             BTFSS    STATUS    , C        ; se saca por lφnea de datos 1 ≤ un 0
  285.             GOTO    lblDS1821ByteOut0
  286.             GOTO    lblDS1821ByteOut1
  287. lblDS1821ByteOut2    DECFSZ    bContador3    , f    ; Continuamos la operaci≤n hasta que
  288.             GOTO    lblDS1821ByteOut3    ; saquemos los 8 bits
  289.             RETURN
  290.  
  291. lblDS1821ByteOut0    CALL    subDS1821Pin0        ; Sacamos por la lφnea de datos    
  292.             MOVLW    .6            ; el valor de un bit 0
  293.             CALL    subRetardo10us
  294.             CALL    subDS1821Pin1
  295.             GOTO    lblDS1821ByteOut2
  296.  
  297. lblDS1821ByteOut1    CALL    subDS1821Pin0        ; Sacamos por la lφnea de datos
  298.             CALL    subDS1821Pin1        ; el valor de un bit 1
  299.             MOVLW    .6
  300.             CALL    subRetardo10us
  301.             GOTO    lblDS1821ByteOut2
  302. ; ***********************************************************************************************
  303. ; Subrutina: subConvierteTemp ---> Pasa de un valor binario con signo a un valor BCD con signo    *
  304. ;                                                *
  305. ; Entrada:    bTemperatura    -> Temperatura a convertir                    *
  306. ; Salida:    bDigito1    -> Dφgito menos significativo                    *
  307. ;        bDigito2    ->                                 *
  308. ;        bDigito3    -> Dφgito mßs significativo y signo si la T¬ es negativa     *
  309. ; ***********************************************************************************************
  310. subConvierteTemp    BTFSS    bTemperatura , 7    ; Vemos si se trata de un n·mero negativo
  311.             GOTO    lblConversion        ; Se trata de un n·mero positivo e
  312.                              ; iniciamos la comversi≤n
  313.  
  314.             MOVLW    0ah            ; Carga en w la representaci≤n del
  315.                              ; signo menos (-)
  316.             MOVWF    bDigito3        ; Guarda el valor para el dφgito mßs
  317.                              ; significativo
  318.             
  319.             COMF    bTemperatura , f    ; Complementamos valor de la temperatura
  320.             INCF    bTemperatura , f    ; Sumamos la unidad, estas operaciones
  321.                              ; calculan el complemento a dos 
  322. lblConversion        MOVF    bTemperatura    , w    ; Guarda el valor actual de temperatura
  323.             MOVWF    bTemperaturaTmp    ;
  324.  
  325.             MOVLW    0Ah            ; Resta 10 al valor actual de temperatura 
  326.             SUBWF    bTemperatura    , f    ; si es menor que 0 hemos llegado a las
  327.                              ; unidades
  328.             BTFSS    STATUS , C        ;
  329.             GOTO    lblFinConversion    ; 
  330.  
  331.             INCF    bDigito2 , f        ; 
  332.             MOVF    bDigito2 , w        ; Pasamos el valor del dφgito 1 a W        
  333.             SUBLW    0Ah            ; Resta a W el valor 10 para saber si 
  334.             BTFSS    STATUS    , Z        ; se deben actualizar las decenas
  335.             GOTO    lblConversion
  336.  
  337.             CLRF    bDigito2        ; Borramos el dφgito de las centenas
  338.             INCF    bDigito3 , f        ; Actualizamos el valor de las decenas
  339.             GOTO    lblConversion
  340.  
  341. lblFinConversion    MOVF    bTemperaturaTmp , w    ; Coloca el valor de las unidades en el
  342.                              ; dφgito 1
  343.             MOVWF    bDigito1        ; 
  344.  
  345.             RETURN
  346. ; ***********************************************************************************************
  347. ; Subrutina: subMuestra ---> Muestra la temperatura en los displays de 7 segmentos        *
  348. ;                                                *
  349. ; Entrada:    w -> Dφgito mostrar                                *
  350. ; Salida:    w -> Representaci≤n del dφgito                            *
  351. ; ***********************************************************************************************
  352. subMuestra        MOVF    bDigito1 , w        ; Valor del dφgito1 a W
  353.             CALL    subDigito        ; Hacemos la conversi≤n
  354.             MOVWF    PORTB            ; Mostramos el valor del dφgito
  355.             BSF    PORTA , 1        ; Encendemos el Dφgito 1
  356.  
  357.             MOVLW    .3            ; Retardo de 3ms
  358.             CALL    subRetardoNms
  359.     
  360.             BCF    PORTA , 1        ; Apagamos el dφgito 1
  361.             MOVF    bDigito2 , w        ; Valor del dφgito2 a W
  362.             CALL    subDigito        ; Hacemos la conversi≤n
  363.             MOVWF    PORTB            ; Mostramos el valor del dφgito
  364.             BSF    PORTA , 2        ; Encendemos el Dφgito 2
  365.  
  366.             MOVLW    .3            ; Retardo de 3ms
  367.             CALL    subRetardoNms
  368.  
  369.             BCF    PORTA , 2        ; Apagamos el dφgito 2
  370.             MOVF    bDigito3 , w        ; Valor del dφgito3 a W
  371.             CALL    subDigito        ; Hacemos la conversi≤n
  372.             MOVWF    PORTB            ; Mostramos el valor del dφgito
  373.             BSF    PORTA , 3        ; Encendemos el Dφgito 3
  374.  
  375.             MOVLW    .3            ; Retardo de 3ms
  376.             CALL    subRetardoNms
  377.  
  378.             BCF    PORTA , 3        ; Apagamos el dφgito 3
  379.  
  380.             RETURN
  381.  
  382.             END
  383.